
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>线程同步与互斥 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>线程同步与互斥 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">线程同步的核心目标是什么？为了实现这个目标，它包含哪两个关键概念？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">线程同步的核心目标是防止多个线程并发访问共享资源时出现数据不一致的情况。它包含两个关键概念：互斥性，即确保同一时刻只有一个线程能执行临界区代码；以及内存可见性，即确保一个线程修改的数据对其他线程立即可见。</div>
          </div>
          <div class="card-source">来源: 1. 线程同步的基本概念与目的</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当`synchronized`关键字修饰实例方法和静态方法时，它们分别锁定的是什么对象？这两种锁有什么关键区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当修饰实例方法时，`synchronized`锁定的是当前对象的实例（`this`），这被称为实例锁。当修饰静态方法时，它锁定的是类的`Class`对象，这被称为类锁。关键区别在于，实例锁只影响同一个对象实例的多个线程，而类锁会影响该类的所有实例。</div>
          </div>
          <div class="card-source">来源: 2.1 同步方法的实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实现原理</div>
          <div class="card-question">ReentrantLock是如何实现“可重入”特性的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实现原理</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ReentrantLock的可重入特性是通过一个内部计数器实现的。当一个线程请求它已经持有的锁时，它不会被阻塞，而是将计数器的值加一。每次线程释放锁时，计数器减一。只有当计数器减为0时，该锁才会被完全释放，其他线程才能获取它。</div>
          </div>
          <div class="card-source">来源: 3.2 可重入锁的实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">死锁的产生需要同时满足哪四个必要条件？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">死锁的产生必须同时满足以下四个条件：1. 互斥条件：资源一次只能被一个线程使用。2. 请求与保持条件：一个线程在持有至少一个资源的同时，又请求新的资源。3. 不剥夺条件：线程已获得的资源在未使用完之前，不能被强行剥夺。4. 循环等待条件：多个线程之间形成一种头尾相接的循环等待资源关系。</div>
          </div>
          <div class="card-source">来源: 5.1 死锁的产生条件</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">除了规范化锁的请求顺序，文档还提到了哪种使用`ReentrantLock`来避免死锁的方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档提到了使用`ReentrantLock`的锁超时机制来避免死锁。通过调用`tryLock()`方法并设置一个超时时间，线程可以在指定时间内尝试获取锁，如果超时仍未获取成功，则会放弃等待，从而避免了因无限期等待而导致的死锁。</div>
          </div>
          <div class="card-source">来源: 5.2 死锁的防止</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">`volatile`关键字在多线程编程中的主要作用是什么？它无法保证什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`volatile`关键字的主要作用是保证共享变量在多个线程之间的可见性，确保一个线程对变量的修改能被其他线程立即看到。然而，它无法保证操作的原子性。</div>
          </div>
          <div class="card-source">来源: 6.1 `volatile`的作用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Java中的`wait()`和`notify()`方法主要用于实现什么功能？当一个线程调用`wait()`方法时，它持有的锁会发生什么变化？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`wait()`和`notify()`方法用于实现线程间的协调与通信。当一个线程在同步块中调用某个对象的`wait()`方法时，该线程会进入等待状态，并且会释放它在该对象上持有的锁，以便其他线程有机会获取该锁并执行。</div>
          </div>
          <div class="card-source">来源: 7. wait()、notify()与线程通信</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是锁竞争？它会对程序性能产生什么影响？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">锁竞争是指多个线程同时尝试获取同一把锁的情况。它会导致未获得锁的线程被阻塞，直到锁被释放，这会严重影响程序的并发性能，形成性能瓶颈。</div>
          </div>
          <div class="card-source">来源: 8.1 锁竞争与性能瓶颈</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">为了提升同步代码的性能，文档中推荐了哪两种高效同步策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档推荐了两种高效同步策略：1. 减少锁的粒度，即尽可能缩小同步代码块的范围，以减少锁被持有的时间和竞争的可能性。2. 使用锁分段技术，将数据分成多个段，每段使用不同的锁，从而允许多个线程并行访问不同段的数据。</div>
          </div>
          <div class="card-source">来源: 8.2 高效同步策略</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
